package net.imwork.amorgemini.core.config;

import net.imwork.amorgemini.core.security.CustomUserDetailsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

/**
 * Created by lvbr on 2017-07-28 23:31.
 */
@Configuration
@EnableWebSecurity
//用于@PreAuthorize的生效,基于方法的权限控制
//@EnableGlobalMethodSecurity(prePostEnabled = true)
//覆盖默认的spring security提供的配置
//@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    UserDetailsService customUserService() { //注册UserDetailsService 的bean
        return new CustomUserDetailsService();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserService()); //user Details Service验证

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /*http.csrf().disable()//禁用CSRF保护
                .authorizeRequests()
//                .mvcMatchers("/user/login", "/user/register").permitAll()
                .mvcMatchers("/book/saveBook").hasRole("USER")
                .anyRequest().authenticated() //任何请求,登录后可以访问
                .and()
                .formLogin()
                .loginPage("/user/login")
                .failureUrl("/user/login?error")
                .permitAll() //登录页面用户任意访问
                .and()
                .logout().permitAll(); //注销行为任意访问*/
    }
//    @Override
//    protected void configure(HttpSecurity http) throws Exception {
//        http
//                //禁用CSRF保护
//                .csrf().disable()
//                .authorizeRequests()
//                //任何访问都必须授权
//                .anyRequest().fullyAuthenticated()
//                //配置那些路径可以不用权限访问
//                .mvcMatchers("/user/login", "/user/register").permitAll()
//                .and()
//                .formLogin()
//                .loginPage("/login")
//                .failureUrl("/login?error")
//                .permitAll()
//                //登陆成功后的处理，因为是API的形式所以不用跳转页面
//                .successHandler(new RestAuthenticationSuccessHandler())
//                //登陆失败后的处理
//                .failureHandler(new SimpleUrlAuthenticationFailureHandler())
//                .and()
//                //登出后的处理
//                .logout().logoutSuccessHandler(new RestLogoutSuccessHandler())
//                .and()
//                //认证不通过后的处理
//                .exceptionHandling()
//                .authenticationEntryPoint(new RestAuthenticationEntryPoint())
//        ;
//    }
//
//    @Autowired
//    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
//        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
//    }
//    /**
//     * 通过@EnableWebSecurity注解开启Spring Security的功能
//     * 继承WebSecurityConfigurerAdapter，并重写它的方法来设置一些web安全的细节
//     * configure(HttpSecurity http)方法
//     * 通过authorizeRequests()定义哪些URL需要被保护、哪些不需要被保护。例如以上代码指定了/和/home不需要任何认证就可以访问，其他的路径都必须通过身份验证。
//     * 通过formLogin()定义当需要用户登录时候，转到的登录页面。
//     * configureGlobal(AuthenticationManagerBuilder auth)方法，在内存中创建了一个用户，该用户的名称为user，密码为password，用户角色为USER。
//     */
//
//
//    /**
//     * 登陆成功后的处理
//     */
//    public static class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
//
//        @Override
//        public void onAuthenticationSuccess(HttpServletRequest request,
//                                            HttpServletResponse response, Authentication authentication)
//                throws ServletException, IOException {
//
//            clearAuthenticationAttributes(request);
//        }
//    }
//
//    /**
//     * 登出成功后的处理
//     */
//    public static class RestLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
//
//        @Override
//        public void onLogoutSuccess(HttpServletRequest request,
//                                    HttpServletResponse response, Authentication authentication)
//                throws IOException, ServletException {
//            //Do nothing!
//        }
//    }
//
//    /**
//     * 权限不通过的处理
//     */
//    public static class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
//
//        @Override
//        public void commence(HttpServletRequest request,
//                             HttpServletResponse response,
//                             AuthenticationException authException) throws IOException {
//            response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
//                    "Authentication Failed: " + authException.getMessage());
//        }
//    }
}
